// package com.example.caffeinecache01.config;
//
// import com.fasterxml.jackson.annotation.JsonAutoDetect;
// import com.fasterxml.jackson.annotation.PropertyAccessor;
// import com.fasterxml.jackson.databind.DeserializationFeature;
// import com.fasterxml.jackson.databind.ObjectMapper;
// import com.fasterxml.jackson.databind.SerializationFeature;
// import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
// import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
// import org.springframework.beans.factory.annotation.Value;
// import org.springframework.context.annotation.Bean;
// import org.springframework.context.annotation.Configuration;
// import org.springframework.data.redis.cache.RedisCacheConfiguration;
// import org.springframework.data.redis.cache.RedisCacheManager;
// import org.springframework.data.redis.cache.RedisCacheWriter;
// import org.springframework.data.redis.connection.RedisConnectionFactory;
// import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
// import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
// import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
// import org.springframework.data.redis.core.RedisTemplate;
// import org.springframework.data.redis.core.StringRedisTemplate;
// import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
// import org.springframework.data.redis.serializer.RedisSerializationContext;
// import redis.clients.jedis.JedisPoolConfig;
//
// import java.time.Duration;
// import java.util.HashMap;
// import java.util.Map;
//
// @Configuration
// public class RedisConfig {
//
//     @Value("${spring.redis.jedis.pool.max-idle}")
//     private Integer maxIdle;
//     @Value("${spring.redis.jedis.pool.min-idle}")
//     private Integer minIdle;
//     @Value("${spring.redis.jedis.pool.max-wait}")
//     private Long maxWait;
//
//     @Value("${spring.redis.host}")
//     private String host;
//
//     @Value("${spring.redis.port}")
//     private Integer port;
//
//
//     @Bean
//     public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
//         StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(factory);
//         return stringRedisTemplate;
//     }
//
//     @Bean
//     public JedisPoolConfig jedisPoolConfig() {
//         JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//         // 最大连接数
//         jedisPoolConfig.setMaxTotal(maxIdle);
//         // 最小空闲连接数
//         jedisPoolConfig.setMinIdle(minIdle);
//         // 当池内没有可用连接时，最大等待时间
//         jedisPoolConfig.setMaxWaitMillis(maxWait);
//         // 其他属性可以自行添加
//         return jedisPoolConfig;
//     }
//
//     @Bean
//     public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
//         System.out.println(">>> RedisHost:" + host);
//         System.out.println(">>> RedisPort:" + port);
//         RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
//         // 设置redis服务器的host或者ip地址
//         redisStandaloneConfiguration.setHostName(host);
//         redisStandaloneConfiguration.setPort(port);
//         // 获得默认的连接池构造
//         // 这里需要注意的是，edisConnectionFactoryJ对于Standalone模式的没有（RedisStandaloneConfiguration，JedisPoolConfig）的构造函数，对此
//         // 我们用JedisClientConfiguration接口的builder方法实例化一个构造器，还得类型转换
//         JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcf = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration
//                 .builder();
//         // 修改我们的连接池配置
//         jpcf.poolConfig(jedisPoolConfig);
//         // 通过构造器来构造jedis客户端配置
//         JedisClientConfiguration jedisClientConfiguration = jpcf.build();
//
//         return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
//     }
//
//     @Bean
//     public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
//         return new RedisCacheManager(
//                 RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
//                 this.getRedisCacheConfigurationWithTtl(2 * 60  * 60),
//                 this.getRedisCacheConfigurationMap()
//         );
//     }
//
//     private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {
//         Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
//         redisCacheConfigurationMap.put("carrier_cn_cloud:AkeetaProduct", this.getRedisCacheConfigurationWithTtl(2 * 60 * 60));
//         redisCacheConfigurationMap.put("carrier_cn_cloud:MooseAkeetaProduct", this.getRedisCacheConfigurationWithTtl(2 * 60  * 60));
//         return redisCacheConfigurationMap;
//     }
//
//     private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) {
//         Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//         ObjectMapper om = new ObjectMapper();
//         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//         om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
//
//         om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
//         om.registerModule(new JavaTimeModule());
//
//         om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//
//         jackson2JsonRedisSerializer.setObjectMapper(om);
//         RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
//         redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(
//                 RedisSerializationContext
//                         .SerializationPair
//                         .fromSerializer(jackson2JsonRedisSerializer)
//         ).entryTtl(Duration.ofSeconds(seconds));
//
//         return redisCacheConfiguration;
//     }
//
// }
